library(readr)
library(tidyr)
library(dplyr)
library(ggplot2)
library(lubridate)
library(UsingR)
library(ggcorrplot)
library(usmap)
library(PerformanceAnalytics)
library(ggcorrplot)
library(vcd)
library(corrr)
library(tidyverse)
library(rcompanion)

Cmd+Option+I.

df0 <- read_csv("Provisional_COVID-19_Deaths_by_Place_of_Death_and_Age.csv")

── Column specification ─────────────────────────────────────────────────────────────────
cols(
  `Data as of` = col_character(),
  `Start Date` = col_character(),
  `End Date` = col_character(),
  Group = col_character(),
  Year = col_logical(),
  Month = col_logical(),
  `HHS Region` = col_double(),
  State = col_character(),
  `Place of Death` = col_character(),
  `Age group` = col_character(),
  `COVID-19 Deaths` = col_double(),
  `Total Deaths` = col_double(),
  `Pneumonia Deaths` = col_double(),
  `Pneumonia and COVID-19 Deaths` = col_double(),
  `Influenza Deaths` = col_double(),
  `Pneumonia, Influenza, or COVID-19 Deaths` = col_double(),
  Footnote = col_character()
)

183708 parsing failures.
 row  col           expected actual                                                        file
4375 Year 1/0/T/F/TRUE/FALSE   2020 'Provisional_COVID-19_Deaths_by_Place_of_Death_and_Age.csv'
4376 Year 1/0/T/F/TRUE/FALSE   2020 'Provisional_COVID-19_Deaths_by_Place_of_Death_and_Age.csv'
4377 Year 1/0/T/F/TRUE/FALSE   2020 'Provisional_COVID-19_Deaths_by_Place_of_Death_and_Age.csv'
4378 Year 1/0/T/F/TRUE/FALSE   2020 'Provisional_COVID-19_Deaths_by_Place_of_Death_and_Age.csv'
4379 Year 1/0/T/F/TRUE/FALSE   2020 'Provisional_COVID-19_Deaths_by_Place_of_Death_and_Age.csv'
.... .... .................. ...... ...........................................................
See problems(...) for more details.
df0 %>% head()

# taking away the month and year since no info
df1= df0[,-c(5,6)]
df1 %>% head()


unique(df1[,1]) # no need for this one since all have been lastlyupdated at once
df2= df1[,-c(1)]
df2 %>% head() 


colnames(df2)
 [1] "Start Date"                              
 [2] "End Date"                                
 [3] "Group"                                   
 [4] "HHS Region"                              
 [5] "State"                                   
 [6] "Place of Death"                          
 [7] "Age group"                               
 [8] "COVID-19 Deaths"                         
 [9] "Total Deaths"                            
[10] "Pneumonia Deaths"                        
[11] "Pneumonia and COVID-19 Deaths"           
[12] "Influenza Deaths"                        
[13] "Pneumonia, Influenza, or COVID-19 Deaths"
[14] "Footnote"                                
dim(df2)
[1] 104976     14
help("as.Date.character")
df2[1,1]
dates<-df2[,1] 


# view column data class: simple trial
class(df2$`Start Date`)
[1] "character"
dateOnly <- as.Date(df2$`Start Date`, format="%d/%m/%Y")
dateOnly 
   [1] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
   [7] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [13] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [19] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [25] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [31] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [37] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [43] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [49] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [55] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [61] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [67] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [73] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [79] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [85] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [91] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
  [97] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [103] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [109] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [115] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [121] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [127] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [133] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [139] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [145] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [151] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [157] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [163] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [169] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [175] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [181] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [187] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [193] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [199] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [205] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [211] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [217] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [223] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [229] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [235] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [241] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [247] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [253] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [259] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [265] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [271] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [277] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [283] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [289] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [295] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [301] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [307] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [313] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [319] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [325] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [331] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [337] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [343] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [349] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [355] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [361] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [367] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [373] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [379] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [385] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [391] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [397] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [403] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [409] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [415] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [421] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [427] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [433] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [439] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [445] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [451] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [457] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [463] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [469] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [475] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [481] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [487] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [493] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [499] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [505] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [511] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [517] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [523] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [529] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [535] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [541] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [547] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [553] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [559] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [565] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [571] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [577] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [583] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [589] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [595] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [601] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [607] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [613] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [619] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [625] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [631] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [637] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [643] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [649] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [655] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [661] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [667] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [673] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [679] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [685] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [691] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [697] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [703] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [709] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [715] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [721] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [727] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [733] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [739] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [745] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [751] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [757] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [763] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [769] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [775] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [781] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [787] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [793] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [799] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [805] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [811] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [817] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [823] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [829] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [835] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [841] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [847] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [853] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [859] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [865] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [871] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [877] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [883] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [889] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [895] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [901] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [907] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [913] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [919] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [925] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [931] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [937] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [943] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [949] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [955] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [961] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [967] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [973] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [979] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [985] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [991] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [997] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
 [ reached 'max' / getOption("max.print") -- omitted 103976 entries ]
class(dateOnly)
[1] "Date"
# transforming the columns start date and end date to date format:
df3<-df2
df3$`Start Date`<- as.Date(df2$`Start Date`, format="%m/%d/%Y")
df3
df3$`End Date`<- as.Date(df2$`End Date`, format="%m/%d/%Y")
df3

#transform the other columns ( "Group","HHS Region","State","Place of Death" "Age group") into factors:
df4<-df3
col_names <- colnames(df4[,3:7])
df4[col_names] <- lapply(df4[col_names] , factor)
df4

#final dataframe working with:
df<-df4
df
#  function to plot: pick the data set
LevelPlots <- function(dataframe, variable, name_variable, Chosen_Factor) {
  
  ggplot(data = dataframe, aes(x = `Start Date` , y =  variable)) +
    geom_point(aes(colour = factor(Chosen_Factor)))+
    labs(x = "Start Date",
         y = name_variable )
 

}

# 
HistoPlots <- function(dataframe, variable, name_variable) {
  
  ggplot(data=dataframe, aes(variable)) + 
    geom_histogram(breaks=seq(20, 50, by=2), 
                   col="red", 
                   aes(fill=..count..)) +
    labs( title =name_variable )
}
# Total deaths : 
LevelPlots(df, df$`Total Deaths`,"Total Deaths",df$Group)

LevelPlots(df, df$`Total Deaths`,"Total Deaths",df$`HHS Region`)

LevelPlots(df, df$`Total Deaths`,"Total Deaths",df$State)

LevelPlots(df, df$`Total Deaths`,"Total Deaths",df$`Place of Death`)

LevelPlots(df, df$`Total Deaths`,"Total Deaths",df$`Age group`)


HistoPlots(df, df$`Total Deaths`,"Total Deaths")


# "Pneumonia Deaths"  
LevelPlots(df, df$`Pneumonia Deaths`,"Pneumonia Deaths",df$Group)

LevelPlots(df, df$`Pneumonia Deaths`,"Pneumonia Deaths",df$`HHS Region`)

LevelPlots(df, df$`Pneumonia Deaths`,"Pneumonia Deaths",df$State)

LevelPlots(df, df$`Pneumonia Deaths`,"Pneumonia Deaths",df$`Place of Death`)

LevelPlots(df, df$`Pneumonia Deaths`,"Pneumonia Deaths",df$`Age group`)


HistoPlots(df, df$`Pneumonia Deaths`,"Pneumonia Deaths")

# "Pneumonia and COVID-19 Deaths" 

LevelPlots(df, df$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df$Group)

LevelPlots(df, df$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df$`HHS Region`)

LevelPlots(df, df$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df$State)

LevelPlots(df, df$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df$`Place of Death`)

LevelPlots(df, df$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df$`Age group`)


HistoPlots(df, df$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths")

# "Influenza Deaths"    
LevelPlots(df, df$`Influenza Deaths`,"Influenza Deaths",df$Group)

LevelPlots(df, df$`Influenza Deaths`,"Influenza Deaths",df$`HHS Region`)

LevelPlots(df, df$`Influenza Deaths`,"Influenza Deaths",df$State)

LevelPlots(df, df$`Influenza Deaths`,"Influenza Deaths",df$`Place of Death`)

LevelPlots(df, df$`Influenza Deaths`,"Influenza Deaths",df$`Age group`)


HistoPlots(df, df$`Influenza Deaths`,"Influenza Deaths")


# "Pneumonia, Influenza, or COVID-19 Deaths" 

LevelPlots(df, df$`Pneumonia, Influenza, or COVID-19 Deaths`,"Pneumonia, Influenza, or COVID-19 Deaths",df$Group)

LevelPlots(df, df$`Pneumonia, Influenza, or COVID-19 Deaths`,"Pneumonia, Influenza, or COVID-19 Deaths",df$`HHS Region`)

LevelPlots(df, df$`Pneumonia, Influenza, or COVID-19 Deaths`,"Pneumonia, Influenza, or COVID-19 Deaths",df$State)

LevelPlots(df, df$`Pneumonia, Influenza, or COVID-19 Deaths`,"Pneumonia, Influenza, or COVID-19 Deaths",df$`Place of Death`)

LevelPlots(df, df$`Pneumonia, Influenza, or COVID-19 Deaths`,"Pneumonia, Influenza, or COVID-19 Deaths",df$`Age group`)


HistoPlots(df, df$`Pneumonia, Influenza, or COVID-19 Deaths`,"Pneumonia, Influenza, or COVID-19 Deaths")

# trying to understand the start/end date part:
unique(df$`End Date`)
 [1] "2021-09-25" "2020-12-31" "2020-01-31" "2020-02-29" "2020-03-31" "2020-04-30"
 [7] "2020-05-31" "2020-06-30" "2020-07-31" "2020-08-31" "2020-09-30" "2020-10-31"
[13] "2020-11-30" "2021-01-31" "2021-02-28" "2021-03-31" "2021-04-30" "2021-05-31"
[19] "2021-06-30" "2021-07-31" "2021-08-31"
unique(df$`Start Date`)
 [1] "2020-01-01" "2021-01-01" "2020-02-01" "2020-03-01" "2020-04-01" "2020-05-01"
 [7] "2020-06-01" "2020-07-01" "2020-08-01" "2020-09-01" "2020-10-01" "2020-11-01"
[13] "2020-12-01" "2021-02-01" "2021-03-01" "2021-04-01" "2021-05-01" "2021-06-01"
[19] "2021-07-01" "2021-08-01" "2021-09-01"
unique(df$`Age group`) # maybe delete the firt level
[1] All Ages          0-17 years        18-29 years       30-39 years      
[5] 40-49 years       50-64 years       65-74 years       75-84 years      
[9] 85 years and over
9 Levels: 0-17 years 18-29 years 30-39 years 40-49 years 50-64 years ... All Ages
unique(df$Group)
[1] By Total By Year  By Month
Levels: By Month By Total By Year
unique(df$`HHS Region`)
 [1] 0  4  10 9  6  8  1  3  5  7  2 
Levels: 0 1 2 3 4 5 6 7 8 9 10
unique(df$State) # maybe delete the firt level
 [1] United States        Alabama              Alaska               Arizona             
 [5] Arkansas             California           Colorado             Connecticut         
 [9] Delaware             District of Columbia Florida              Georgia             
[13] Hawaii               Idaho                Illinois             Indiana             
[17] Iowa                 Kansas               Kentucky             Louisiana           
[21] Maine                Maryland             Massachusetts        Michigan            
[25] Minnesota            Mississippi          Missouri             Montana             
[29] Nebraska             Nevada               New Hampshire        New Jersey          
[33] New Mexico           New York             New York City        North Carolina      
[37] North Dakota         Ohio                 Oklahoma             Oregon              
[41] Pennsylvania         Rhode Island         South Carolina       South Dakota        
[45] Tennessee            Texas                Utah                 Vermont             
[49] Virginia             Washington           West Virginia        Wisconsin           
[53] Wyoming              Puerto Rico         
54 Levels: Alabama Alaska Arizona Arkansas California Colorado Connecticut ... Wyoming
unique(df$`Place of Death`)# maybe delete the firt level
[1] Total - All Places of Death                     
[2] Healthcare setting, inpatient                   
[3] Healthcare setting, outpatient or emergency room
[4] Healthcare setting, dead on arrival             
[5] Decedent's home                                 
[6] Hospice facility                                
[7] Nursing home/long term care facility            
[8] Other                                           
[9] Place of death unknown                          
9 Levels: Decedent's home ... Total - All Places of Death
df_specific<- df %>% filter(`Age group` != "All Ages" & State != "United States" & `Place of Death` != "Total - All Places of Death")
df_specific


### 
# Total deaths :

# scatter throuh time : 
LevelPlots(df_specific, df_specific$`Total Deaths`,"Total Deaths",df_specific$Group)

LevelPlots(df_specific, df_specific$`Total Deaths`,"Total Deaths",df_specific$`HHS Region`)

LevelPlots(df_specific, df_specific$`Total Deaths`,"Total Deaths",df_specific$State)

LevelPlots(df_specific, df_specific$`Total Deaths`,"Total Deaths",df_specific$`Place of Death`)

LevelPlots(df_specific, df_specific$`Total Deaths`,"Total Deaths",df_specific$`Age group`)




# Remarks:

# "Pneumonia Deaths"  
LevelPlots(df_specific, df_specific$`Pneumonia Deaths`,"Pneumonia Deaths",df_specific$Group)

LevelPlots(df_specific, df_specific$`Pneumonia Deaths`,"Pneumonia Deaths",df_specific$`HHS Region`)

LevelPlots(df_specific, df_specific$`Pneumonia Deaths`,"Pneumonia Deaths",df_specific$State)

LevelPlots(df_specific, df_specific$`Pneumonia Deaths`,"Pneumonia Deaths",df_specific$`Place of Death`)

LevelPlots(df_specific, df_specific$`Pneumonia Deaths`,"Pneumonia Deaths",df_specific$`Age group`)



# "Pneumonia and COVID-19 Deaths" 

LevelPlots(df_specific, df_specific$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df_specific$Group)

LevelPlots(df_specific, df_specific$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df_specific$`HHS Region`)

LevelPlots(df_specific, df_specific$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df_specific$State)

LevelPlots(df_specific, df_specific$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df_specific$`Place of Death`)

LevelPlots(df_specific, df_specific$`Pneumonia and COVID-19 Deaths`,"Pneumonia and COVID-19 Deaths",df_specific$`Age group`)


# "Influenza Deaths"    
LevelPlots(df_specific, df_specific$`Influenza Deaths`,"Influenza Deaths",df_specific$Group)

LevelPlots(df_specific, df_specific$`Influenza Deaths`,"Influenza Deaths",df_specific$`HHS Region`)

LevelPlots(df_specific, df_specific$`Influenza Deaths`,"Influenza Deaths",df_specific$State)

LevelPlots(df_specific, df_specific$`Influenza Deaths`,"Influenza Deaths",df_specific$`Place of Death`)

LevelPlots(df_specific, df_specific$`Influenza Deaths`,"Influenza Deaths",df_specific$`Age group`)

NA
NA
NA
# now same as last week but standardised data: deaths per 10000 people
list_states<-unique(df_specific$State)

TotalDeath_by_state<-df_specific %>% 
  group_by(State) %>% 
  summarise(`Total Deaths`= sum(`Total Deaths`,na.rm=TRUE))

PneumoniaDeath<-df_specific %>% 
  group_by(State) %>% 
  summarise(`Pneumonia Deaths`= sum(`Pneumonia Deaths`,na.rm=TRUE))

PneumoniaCOVIDDeaths<-df_specific %>% 
  group_by(State) %>% 
  summarise(`Pneumonia and COVID-19 Deaths`= sum(`Pneumonia and COVID-19 Deaths`,na.rm=TRUE))

InfluenzaDeaths<-df_specific %>% 
  group_by(State) %>% 
  summarise(`Influenza Deaths`= sum(`Influenza Deaths`,na.rm=TRUE))

PneumoniaInfluenza_or_COVIDDeaths<-df_specific %>% 
  group_by(State) %>% 
  summarise(`Pneumonia, Influenza, or COVID-19 Deaths`= sum(`Pneumonia, Influenza, or COVID-19 Deaths`,na.rm=TRUE))

# omitting for better view Newyork city and puerto rico 
TotalDeath_by_state<-TotalDeath_by_state[-c(34,41),]
PneumoniaDeath_by_state<-PneumoniaDeath[-c(34,41),]
PneumoniaCOVIDDeaths_by_state<-PneumoniaCOVIDDeaths[-c(34,41),]
InfluenzaDeaths_by_state<-InfluenzaDeaths[-c(34,41),]
PneumoniaInfluenza_or_COVIDDeaths_by_state<-PneumoniaInfluenza_or_COVIDDeaths[-c(34,41),]

# standardisind data per 10`000
us_popul<-statepop 

standardise_pop<-function(data)
{
  data[,2]=data[,2]*10000/us_popul$pop_2015
  return(data)
}

TotalDeath_by_state<-standardise_pop(TotalDeath_by_state)
TotalDeath_by_state
PneumoniaDeath_by_state<-standardise_pop(PneumoniaDeath_by_state)
PneumoniaDeath_by_state
PneumoniaCOVIDDeaths_by_state<-standardise_pop(PneumoniaCOVIDDeaths_by_state)
PneumoniaCOVIDDeaths_by_state
InfluenzaDeaths_by_state<-standardise_pop(InfluenzaDeaths_by_state)
InfluenzaDeaths_by_state
PneumoniaInfluenza_or_COVIDDeaths_by_state<-standardise_pop(PneumoniaInfluenza_or_COVIDDeaths_by_state)
PneumoniaInfluenza_or_COVIDDeaths_by_state


# all fine now:
us_popul$full==PneumoniaInfluenza_or_COVIDDeaths_by_state$State
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[18] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[35] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# right datasets
us_TotalDeath<-us_popul
us_TotalDeath$pop_2015<-TotalDeath_by_state$`Total Deaths`

us_PneumoniaDeath<-us_popul
us_PneumoniaDeath$pop_2015<-PneumoniaCOVIDDeaths_by_state$`Pneumonia and COVID-19 Deaths`

us_PneumoniaCOVIDDeaths<-us_popul
us_PneumoniaCOVIDDeaths$pop_2015<-PneumoniaCOVIDDeaths_by_state$`Pneumonia and COVID-19 Deaths`

us_InfluenzaDeaths<-us_popul
us_InfluenzaDeaths$pop_2015<-InfluenzaDeaths_by_state$`Influenza Deaths`

us_PneumoniaInfluenza_or_COVIDDeaths<-us_popul
us_PneumoniaInfluenza_or_COVIDDeaths$pop_2015<-PneumoniaInfluenza_or_COVIDDeaths_by_state$`Pneumonia, Influenza, or COVID-19 Deaths`

# plots

plot_usmap(data = us_TotalDeath, values = "pop_2015", color = "red") + 
  scale_fill_continuous(name = "us_TotalDeath", label = scales::comma) + 
  theme(legend.position = "right")


plot_usmap(data = us_PneumoniaDeath, values = "pop_2015", color = "red") + 
  scale_fill_continuous(name = "us_PneumoniaDeath", label = scales::comma) + 
  theme(legend.position = "right")


plot_usmap(data = us_PneumoniaCOVIDDeaths, values = "pop_2015", color = "red") + 
  scale_fill_continuous(name = "us_PneumoniaCOVIDDeaths)", label = scales::comma) + 
  theme(legend.position = "right")


plot_usmap(data = us_InfluenzaDeaths, values = "pop_2015", color = "red") + 
  scale_fill_continuous(name = "us_InfluenzaDeaths", label = scales::comma) + 
  theme(legend.position = "right")


plot_usmap(data = us_PneumoniaInfluenza_or_COVIDDeaths, values = "pop_2015", color = "red") + 
  scale_fill_continuous(name = "us_PneumoniaInfluenza_or_COVIDDeaths", label = scales::comma) + 
  theme(legend.position = "right")

NA
NA
NA
# sort the date depending on the category:

Select_Age_Group<-function(DataFrame, agegroup)
{ 
  age_groups<-unique(df$`Age group`)
  if(agegroup %in% age_groups)
     {
      df1= DataFrame %>% filter(`Age group` == agegroup )
      return(df1)
     }
  else{
    warning("Age group selected not in the list, the returned dataframe has not been filtered")
    return (DataFrame)
     }
  }
#Test:
#Select_Age_Group(df,"0-17 years")

Select_Group<-function(DataFrame, group)
{ 
  all_groups<-unique(df$`Group`)
  if(group %in% all_groups)
  {
    df1= DataFrame %>% filter(`Group` == group )
    return(df1)
  }
  else{
    warning("Group selected not in the list, the returned dataframe has not been filtered")
    return (DataFrame)
  }
}
#Test:
#Select_Group(df, "By Total")

Select_HHSRegion<-function(DataFrame, region)
{ 
  all_regions<-unique(df$`HHS Region`)
  if(region %in% all_regions)
  {
    df1= DataFrame %>% filter(`HHS Region` == region )
    return(df1)
  }
  else{
    warning("HHS Region selected not in the list, the returned dataframe has not been filtered")
    return (DataFrame)
  }
}

#Test:
# Select_HHSRegion(df,4)
# Select_HHSRegion(df,-1)

Select_State<-function(DataFrame, state)
{ 
  all_states<-unique(df$State)
  if(state %in% all_states)
  {
    df1= DataFrame %>% filter(`State` == state )
    return(df1)
  }
  else{
    warning("State selected not in the list, the returned dataframe has not been filtered")
    return (DataFrame)
  }
}

#Test:
#Select_State(df,"Hawaii")
#Select_State(df,-1)

Select_PlaceDeath<-function(DataFrame, place_d)
{ 
  all_places<-unique(df$`Place of Death`)
  if(place_d %in% all_places)
  {
    df1= DataFrame %>% filter(`Place of Death` == place_d )
    return(df1)
  }
  else{
    warning("Place of death selected not in the list, the returned dataframe has not been filtered")
    return (DataFrame)
  }
}

#Test:
# Select_PlaceDeath(df,"Healthcare setting, inpatient")
# Select_PlaceDeath(df,-1)

Select_all<-function(DataFrame, agegroup,group,region,state,place_d)
{
  # I want to use %>% but not quite confortable, I ll use brute force first:
  df1=Select_Age_Group(DataFrame,agegroup)
  df2= Select_Group(df1,group)
  df3=Select_HHSRegion(df2, region)
  df4=Select_State(df3,state)
  df5=Select_PlaceDeath(df4,place_d)
  return(df5)
}

# eventually gives you 0 or 1 column
#Select_all(df,"0-17 years","By Total",-1,"California","Healthcare setting, inpatient")
#Tests:
Select_PlaceDeath(df,"Healthcare setting, inpatient")
Select_PlaceDeath(df,-1)
Place of death selected not in the list, the returned dataframe has not been filtered
Select_all(df,"0-17 years","By Total",-1,"California","Healthcare setting, inpatient")
HHS Region selected not in the list, the returned dataframe has not been filtered
Select_State(df,"Hawaii")
Select_State(df,-1)
State selected not in the list, the returned dataframe has not been filtered
Select_HHSRegion(df,4)
Select_HHSRegion(df,-1)
HHS Region selected not in the list, the returned dataframe has not been filtered
Select_Group(df, "By Total")
Select_Age_Group(df,"0-17 years")

Now studying correlations:

df_corr_agegroups1<-Select_Age_Group(df,"All Ages") [,8:13] 
df_corr_agegroups2<-Select_Age_Group(df,"0-17 years")[,8:13]
df_corr_agegroups3<-Select_Age_Group(df,"18-29 years")[,8:13]
df_corr_agegroups4<-Select_Age_Group(df,"30-39 years")[,8:13]
df_corr_agegroups5<-Select_Age_Group(df,"40-49 years")[,8:13]
df_corr_agegroups6<-Select_Age_Group(df,"50-64 years")[,8:13]
df_corr_agegroups7<-Select_Age_Group(df,"65-74 years")[,8:13]
df_corr_agegroups8<-Select_Age_Group(df,"75-84 years")[,8:13]
df_corr_agegroups9<-Select_Age_Group(df,"85 years and over")[,8:13]
# # install.packages("PerformanceAnalytics")
library(PerformanceAnalytics)
chart.Correlation(df_corr_agegroups1, histogram = TRUE, method = "pearson")

chart.Correlation(df_corr_agegroups2, histogram = TRUE, method = "pearson")

chart.Correlation(df_corr_agegroups3, histogram = TRUE, method = "pearson")

chart.Correlation(df_corr_agegroups4, histogram = TRUE, method = "pearson")

chart.Correlation(df_corr_agegroups5, histogram = TRUE, method = "pearson")

chart.Correlation(df_corr_agegroups6, histogram = TRUE, method = "pearson")

chart.Correlation(df_corr_agegroups7, histogram = TRUE, method = "pearson")

chart.Correlation(df_corr_agegroups8, histogram = TRUE, method = "pearson")

chart.Correlation(df_corr_agegroups9, histogram = TRUE, method = "pearson")

model.matrix(~0+., data=df) %>% 
  cor(use="pairwise.complete.obs") %>% 
  ggcorrplot(show.diag = F, type="lower", lab=TRUE, lab_size=2)
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels
st1 <- structable(~Group+`Age group`, df)
#st1
pairs(st1)


st2 <- structable(~`HHS Region`+`State`+`Place of Death`, df)
#st2
pairs(st2)


st_age<- structable(~`COVID-19 Deaths`+`Pneumonia Deaths`+`Age group`, df)
pairs(st_age)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KFVzaW5nUikKbGlicmFyeShnZ2NvcnJwbG90KQpsaWJyYXJ5KHVzbWFwKQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQpsaWJyYXJ5KGdnY29ycnBsb3QpCmxpYnJhcnkodmNkKQpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyY29tcGFuaW9uKQpgYGAKCiAqQ21kK09wdGlvbitJKi4KCmBgYHtyfQpkZjAgPC0gcmVhZF9jc3YoIlByb3Zpc2lvbmFsX0NPVklELTE5X0RlYXRoc19ieV9QbGFjZV9vZl9EZWF0aF9hbmRfQWdlLmNzdiIpCgpkZjAgJT4lIGhlYWQoKQoKIyB0YWtpbmcgYXdheSB0aGUgbW9udGggYW5kIHllYXIgc2luY2Ugbm8gaW5mbwpkZjE9IGRmMFssLWMoNSw2KV0KZGYxICU+JSBoZWFkKCkKCgp1bmlxdWUoZGYxWywxXSkgIyBubyBuZWVkIGZvciB0aGlzIG9uZSBzaW5jZSBhbGwgaGF2ZSBiZWVuIGxhc3RseXVwZGF0ZWQgYXQgb25jZQpkZjI9IGRmMVssLWMoMSldCmRmMiAlPiUgaGVhZCgpIAoKCmNvbG5hbWVzKGRmMikKZGltKGRmMikKCgoKaGVscCgiYXMuRGF0ZS5jaGFyYWN0ZXIiKQpkZjJbMSwxXQpkYXRlczwtZGYyWywxXSAKCgojIHZpZXcgY29sdW1uIGRhdGEgY2xhc3M6IHNpbXBsZSB0cmlhbApjbGFzcyhkZjIkYFN0YXJ0IERhdGVgKQpkYXRlT25seSA8LSBhcy5EYXRlKGRmMiRgU3RhcnQgRGF0ZWAsIGZvcm1hdD0iJWQvJW0vJVkiKQpkYXRlT25seSAKY2xhc3MoZGF0ZU9ubHkpCgojIHRyYW5zZm9ybWluZyB0aGUgY29sdW1ucyBzdGFydCBkYXRlIGFuZCBlbmQgZGF0ZSB0byBkYXRlIGZvcm1hdDoKZGYzPC1kZjIKZGYzJGBTdGFydCBEYXRlYDwtIGFzLkRhdGUoZGYyJGBTdGFydCBEYXRlYCwgZm9ybWF0PSIlbS8lZC8lWSIpCmRmMwpkZjMkYEVuZCBEYXRlYDwtIGFzLkRhdGUoZGYyJGBFbmQgRGF0ZWAsIGZvcm1hdD0iJW0vJWQvJVkiKQpkZjMKCiN0cmFuc2Zvcm0gdGhlIG90aGVyIGNvbHVtbnMgKCAiR3JvdXAiLCJISFMgUmVnaW9uIiwiU3RhdGUiLCJQbGFjZSBvZiBEZWF0aCIgIkFnZSBncm91cCIpIGludG8gZmFjdG9yczoKZGY0PC1kZjMKY29sX25hbWVzIDwtIGNvbG5hbWVzKGRmNFssMzo3XSkKZGY0W2NvbF9uYW1lc10gPC0gbGFwcGx5KGRmNFtjb2xfbmFtZXNdICwgZmFjdG9yKQpkZjQKCiNmaW5hbCBkYXRhZnJhbWUgd29ya2luZyB3aXRoOgpkZjwtZGY0CmRmCmBgYAoKCmBgYHtyfQojICBmdW5jdGlvbiB0byBwbG90OiBwaWNrIHRoZSBkYXRhIHNldApMZXZlbFBsb3RzIDwtIGZ1bmN0aW9uKGRhdGFmcmFtZSwgdmFyaWFibGUsIG5hbWVfdmFyaWFibGUsIENob3Nlbl9GYWN0b3IpIHsKICAKICBnZ3Bsb3QoZGF0YSA9IGRhdGFmcmFtZSwgYWVzKHggPSBgU3RhcnQgRGF0ZWAgLCB5ID0gIHZhcmlhYmxlKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gZmFjdG9yKENob3Nlbl9GYWN0b3IpKSkrCiAgICBsYWJzKHggPSAiU3RhcnQgRGF0ZSIsCiAgICAgICAgIHkgPSBuYW1lX3ZhcmlhYmxlICkKIAoKfQoKIyAKSGlzdG9QbG90cyA8LSBmdW5jdGlvbihkYXRhZnJhbWUsIHZhcmlhYmxlLCBuYW1lX3ZhcmlhYmxlKSB7CiAgCiAgZ2dwbG90KGRhdGE9ZGF0YWZyYW1lLCBhZXModmFyaWFibGUpKSArIAogICAgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzPXNlcSgyMCwgNTAsIGJ5PTIpLCAKICAgICAgICAgICAgICAgICAgIGNvbD0icmVkIiwgCiAgICAgICAgICAgICAgICAgICBhZXMoZmlsbD0uLmNvdW50Li4pKSArCiAgICBsYWJzKCB0aXRsZSA9bmFtZV92YXJpYWJsZSApCn0KYGBgCgpgYGB7cn0KIyBUb3RhbCBkZWF0aHMgOiAKTGV2ZWxQbG90cyhkZiwgZGYkYFRvdGFsIERlYXRoc2AsIlRvdGFsIERlYXRocyIsZGYkR3JvdXApCkxldmVsUGxvdHMoZGYsIGRmJGBUb3RhbCBEZWF0aHNgLCJUb3RhbCBEZWF0aHMiLGRmJGBISFMgUmVnaW9uYCkKTGV2ZWxQbG90cyhkZiwgZGYkYFRvdGFsIERlYXRoc2AsIlRvdGFsIERlYXRocyIsZGYkU3RhdGUpCkxldmVsUGxvdHMoZGYsIGRmJGBUb3RhbCBEZWF0aHNgLCJUb3RhbCBEZWF0aHMiLGRmJGBQbGFjZSBvZiBEZWF0aGApCkxldmVsUGxvdHMoZGYsIGRmJGBUb3RhbCBEZWF0aHNgLCJUb3RhbCBEZWF0aHMiLGRmJGBBZ2UgZ3JvdXBgKQoKSGlzdG9QbG90cyhkZiwgZGYkYFRvdGFsIERlYXRoc2AsIlRvdGFsIERlYXRocyIpCgojICJQbmV1bW9uaWEgRGVhdGhzIiAgCkxldmVsUGxvdHMoZGYsIGRmJGBQbmV1bW9uaWEgRGVhdGhzYCwiUG5ldW1vbmlhIERlYXRocyIsZGYkR3JvdXApCkxldmVsUGxvdHMoZGYsIGRmJGBQbmV1bW9uaWEgRGVhdGhzYCwiUG5ldW1vbmlhIERlYXRocyIsZGYkYEhIUyBSZWdpb25gKQpMZXZlbFBsb3RzKGRmLCBkZiRgUG5ldW1vbmlhIERlYXRoc2AsIlBuZXVtb25pYSBEZWF0aHMiLGRmJFN0YXRlKQpMZXZlbFBsb3RzKGRmLCBkZiRgUG5ldW1vbmlhIERlYXRoc2AsIlBuZXVtb25pYSBEZWF0aHMiLGRmJGBQbGFjZSBvZiBEZWF0aGApCkxldmVsUGxvdHMoZGYsIGRmJGBQbmV1bW9uaWEgRGVhdGhzYCwiUG5ldW1vbmlhIERlYXRocyIsZGYkYEFnZSBncm91cGApCgpIaXN0b1Bsb3RzKGRmLCBkZiRgUG5ldW1vbmlhIERlYXRoc2AsIlBuZXVtb25pYSBEZWF0aHMiKQojICJQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRocyIgCgpMZXZlbFBsb3RzKGRmLCBkZiRgUG5ldW1vbmlhIGFuZCBDT1ZJRC0xOSBEZWF0aHNgLCJQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRocyIsZGYkR3JvdXApCkxldmVsUGxvdHMoZGYsIGRmJGBQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzIixkZiRgSEhTIFJlZ2lvbmApCkxldmVsUGxvdHMoZGYsIGRmJGBQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzIixkZiRTdGF0ZSkKTGV2ZWxQbG90cyhkZiwgZGYkYFBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzYCwiUG5ldW1vbmlhIGFuZCBDT1ZJRC0xOSBEZWF0aHMiLGRmJGBQbGFjZSBvZiBEZWF0aGApCkxldmVsUGxvdHMoZGYsIGRmJGBQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzIixkZiRgQWdlIGdyb3VwYCkKCkhpc3RvUGxvdHMoZGYsIGRmJGBQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzIikKIyAiSW5mbHVlbnphIERlYXRocyIgICAgCkxldmVsUGxvdHMoZGYsIGRmJGBJbmZsdWVuemEgRGVhdGhzYCwiSW5mbHVlbnphIERlYXRocyIsZGYkR3JvdXApCkxldmVsUGxvdHMoZGYsIGRmJGBJbmZsdWVuemEgRGVhdGhzYCwiSW5mbHVlbnphIERlYXRocyIsZGYkYEhIUyBSZWdpb25gKQpMZXZlbFBsb3RzKGRmLCBkZiRgSW5mbHVlbnphIERlYXRoc2AsIkluZmx1ZW56YSBEZWF0aHMiLGRmJFN0YXRlKQpMZXZlbFBsb3RzKGRmLCBkZiRgSW5mbHVlbnphIERlYXRoc2AsIkluZmx1ZW56YSBEZWF0aHMiLGRmJGBQbGFjZSBvZiBEZWF0aGApCkxldmVsUGxvdHMoZGYsIGRmJGBJbmZsdWVuemEgRGVhdGhzYCwiSW5mbHVlbnphIERlYXRocyIsZGYkYEFnZSBncm91cGApCgpIaXN0b1Bsb3RzKGRmLCBkZiRgSW5mbHVlbnphIERlYXRoc2AsIkluZmx1ZW56YSBEZWF0aHMiKQoKIyAiUG5ldW1vbmlhLCBJbmZsdWVuemEsIG9yIENPVklELTE5IERlYXRocyIgCgpMZXZlbFBsb3RzKGRmLCBkZiRgUG5ldW1vbmlhLCBJbmZsdWVuemEsIG9yIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSwgSW5mbHVlbnphLCBvciBDT1ZJRC0xOSBEZWF0aHMiLGRmJEdyb3VwKQpMZXZlbFBsb3RzKGRmLCBkZiRgUG5ldW1vbmlhLCBJbmZsdWVuemEsIG9yIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSwgSW5mbHVlbnphLCBvciBDT1ZJRC0xOSBEZWF0aHMiLGRmJGBISFMgUmVnaW9uYCkKTGV2ZWxQbG90cyhkZiwgZGYkYFBuZXVtb25pYSwgSW5mbHVlbnphLCBvciBDT1ZJRC0xOSBEZWF0aHNgLCJQbmV1bW9uaWEsIEluZmx1ZW56YSwgb3IgQ09WSUQtMTkgRGVhdGhzIixkZiRTdGF0ZSkKTGV2ZWxQbG90cyhkZiwgZGYkYFBuZXVtb25pYSwgSW5mbHVlbnphLCBvciBDT1ZJRC0xOSBEZWF0aHNgLCJQbmV1bW9uaWEsIEluZmx1ZW56YSwgb3IgQ09WSUQtMTkgRGVhdGhzIixkZiRgUGxhY2Ugb2YgRGVhdGhgKQpMZXZlbFBsb3RzKGRmLCBkZiRgUG5ldW1vbmlhLCBJbmZsdWVuemEsIG9yIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSwgSW5mbHVlbnphLCBvciBDT1ZJRC0xOSBEZWF0aHMiLGRmJGBBZ2UgZ3JvdXBgKQoKSGlzdG9QbG90cyhkZiwgZGYkYFBuZXVtb25pYSwgSW5mbHVlbnphLCBvciBDT1ZJRC0xOSBEZWF0aHNgLCJQbmV1bW9uaWEsIEluZmx1ZW56YSwgb3IgQ09WSUQtMTkgRGVhdGhzIikKCmBgYAoKCgoKYGBge3J9CiMgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlIHN0YXJ0L2VuZCBkYXRlIHBhcnQ6CnVuaXF1ZShkZiRgRW5kIERhdGVgKQp1bmlxdWUoZGYkYFN0YXJ0IERhdGVgKQp1bmlxdWUoZGYkYEFnZSBncm91cGApICMgbWF5YmUgZGVsZXRlIHRoZSBmaXJ0IGxldmVsCnVuaXF1ZShkZiRHcm91cCkKdW5pcXVlKGRmJGBISFMgUmVnaW9uYCkKdW5pcXVlKGRmJFN0YXRlKSAjIG1heWJlIGRlbGV0ZSB0aGUgZmlydCBsZXZlbAp1bmlxdWUoZGYkYFBsYWNlIG9mIERlYXRoYCkjIG1heWJlIGRlbGV0ZSB0aGUgZmlydCBsZXZlbAoKCmRmX3NwZWNpZmljPC0gZGYgJT4lIGZpbHRlcihgQWdlIGdyb3VwYCAhPSAiQWxsIEFnZXMiICYgU3RhdGUgIT0gIlVuaXRlZCBTdGF0ZXMiICYgYFBsYWNlIG9mIERlYXRoYCAhPSAiVG90YWwgLSBBbGwgUGxhY2VzIG9mIERlYXRoIikKZGZfc3BlY2lmaWMKCgojIyMgCiMgVG90YWwgZGVhdGhzIDoKCiMgc2NhdHRlciB0aHJvdWggdGltZSA6IApMZXZlbFBsb3RzKGRmX3NwZWNpZmljLCBkZl9zcGVjaWZpYyRgVG90YWwgRGVhdGhzYCwiVG90YWwgRGVhdGhzIixkZl9zcGVjaWZpYyRHcm91cCkKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYFRvdGFsIERlYXRoc2AsIlRvdGFsIERlYXRocyIsZGZfc3BlY2lmaWMkYEhIUyBSZWdpb25gKQpMZXZlbFBsb3RzKGRmX3NwZWNpZmljLCBkZl9zcGVjaWZpYyRgVG90YWwgRGVhdGhzYCwiVG90YWwgRGVhdGhzIixkZl9zcGVjaWZpYyRTdGF0ZSkKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYFRvdGFsIERlYXRoc2AsIlRvdGFsIERlYXRocyIsZGZfc3BlY2lmaWMkYFBsYWNlIG9mIERlYXRoYCkKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYFRvdGFsIERlYXRoc2AsIlRvdGFsIERlYXRocyIsZGZfc3BlY2lmaWMkYEFnZSBncm91cGApCgoKCiMgUmVtYXJrczoKCiMgIlBuZXVtb25pYSBEZWF0aHMiICAKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYFBuZXVtb25pYSBEZWF0aHNgLCJQbmV1bW9uaWEgRGVhdGhzIixkZl9zcGVjaWZpYyRHcm91cCkKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYFBuZXVtb25pYSBEZWF0aHNgLCJQbmV1bW9uaWEgRGVhdGhzIixkZl9zcGVjaWZpYyRgSEhTIFJlZ2lvbmApCkxldmVsUGxvdHMoZGZfc3BlY2lmaWMsIGRmX3NwZWNpZmljJGBQbmV1bW9uaWEgRGVhdGhzYCwiUG5ldW1vbmlhIERlYXRocyIsZGZfc3BlY2lmaWMkU3RhdGUpCkxldmVsUGxvdHMoZGZfc3BlY2lmaWMsIGRmX3NwZWNpZmljJGBQbmV1bW9uaWEgRGVhdGhzYCwiUG5ldW1vbmlhIERlYXRocyIsZGZfc3BlY2lmaWMkYFBsYWNlIG9mIERlYXRoYCkKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYFBuZXVtb25pYSBEZWF0aHNgLCJQbmV1bW9uaWEgRGVhdGhzIixkZl9zcGVjaWZpYyRgQWdlIGdyb3VwYCkKCgojICJQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRocyIgCgpMZXZlbFBsb3RzKGRmX3NwZWNpZmljLCBkZl9zcGVjaWZpYyRgUG5ldW1vbmlhIGFuZCBDT1ZJRC0xOSBEZWF0aHNgLCJQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRocyIsZGZfc3BlY2lmaWMkR3JvdXApCkxldmVsUGxvdHMoZGZfc3BlY2lmaWMsIGRmX3NwZWNpZmljJGBQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzIixkZl9zcGVjaWZpYyRgSEhTIFJlZ2lvbmApCkxldmVsUGxvdHMoZGZfc3BlY2lmaWMsIGRmX3NwZWNpZmljJGBQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzIixkZl9zcGVjaWZpYyRTdGF0ZSkKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYFBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzYCwiUG5ldW1vbmlhIGFuZCBDT1ZJRC0xOSBEZWF0aHMiLGRmX3NwZWNpZmljJGBQbGFjZSBvZiBEZWF0aGApCkxldmVsUGxvdHMoZGZfc3BlY2lmaWMsIGRmX3NwZWNpZmljJGBQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRoc2AsIlBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzIixkZl9zcGVjaWZpYyRgQWdlIGdyb3VwYCkKCiMgIkluZmx1ZW56YSBEZWF0aHMiICAgIApMZXZlbFBsb3RzKGRmX3NwZWNpZmljLCBkZl9zcGVjaWZpYyRgSW5mbHVlbnphIERlYXRoc2AsIkluZmx1ZW56YSBEZWF0aHMiLGRmX3NwZWNpZmljJEdyb3VwKQpMZXZlbFBsb3RzKGRmX3NwZWNpZmljLCBkZl9zcGVjaWZpYyRgSW5mbHVlbnphIERlYXRoc2AsIkluZmx1ZW56YSBEZWF0aHMiLGRmX3NwZWNpZmljJGBISFMgUmVnaW9uYCkKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYEluZmx1ZW56YSBEZWF0aHNgLCJJbmZsdWVuemEgRGVhdGhzIixkZl9zcGVjaWZpYyRTdGF0ZSkKTGV2ZWxQbG90cyhkZl9zcGVjaWZpYywgZGZfc3BlY2lmaWMkYEluZmx1ZW56YSBEZWF0aHNgLCJJbmZsdWVuemEgRGVhdGhzIixkZl9zcGVjaWZpYyRgUGxhY2Ugb2YgRGVhdGhgKQpMZXZlbFBsb3RzKGRmX3NwZWNpZmljLCBkZl9zcGVjaWZpYyRgSW5mbHVlbnphIERlYXRoc2AsIkluZmx1ZW56YSBEZWF0aHMiLGRmX3NwZWNpZmljJGBBZ2UgZ3JvdXBgKQoKCgpgYGAKCgoKCmBgYHtyfQojIG5vdyBzYW1lIGFzIGxhc3Qgd2VlayBidXQgc3RhbmRhcmRpc2VkIGRhdGE6IGRlYXRocyBwZXIgMTAwMDAgcGVvcGxlCmxpc3Rfc3RhdGVzPC11bmlxdWUoZGZfc3BlY2lmaWMkU3RhdGUpCgpUb3RhbERlYXRoX2J5X3N0YXRlPC1kZl9zcGVjaWZpYyAlPiUgCiAgZ3JvdXBfYnkoU3RhdGUpICU+JSAKICBzdW1tYXJpc2UoYFRvdGFsIERlYXRoc2A9IHN1bShgVG90YWwgRGVhdGhzYCxuYS5ybT1UUlVFKSkKClBuZXVtb25pYURlYXRoPC1kZl9zcGVjaWZpYyAlPiUgCiAgZ3JvdXBfYnkoU3RhdGUpICU+JSAKICBzdW1tYXJpc2UoYFBuZXVtb25pYSBEZWF0aHNgPSBzdW0oYFBuZXVtb25pYSBEZWF0aHNgLG5hLnJtPVRSVUUpKQoKUG5ldW1vbmlhQ09WSUREZWF0aHM8LWRmX3NwZWNpZmljICU+JSAKICBncm91cF9ieShTdGF0ZSkgJT4lIAogIHN1bW1hcmlzZShgUG5ldW1vbmlhIGFuZCBDT1ZJRC0xOSBEZWF0aHNgPSBzdW0oYFBuZXVtb25pYSBhbmQgQ09WSUQtMTkgRGVhdGhzYCxuYS5ybT1UUlVFKSkKCkluZmx1ZW56YURlYXRoczwtZGZfc3BlY2lmaWMgJT4lIAogIGdyb3VwX2J5KFN0YXRlKSAlPiUgCiAgc3VtbWFyaXNlKGBJbmZsdWVuemEgRGVhdGhzYD0gc3VtKGBJbmZsdWVuemEgRGVhdGhzYCxuYS5ybT1UUlVFKSkKClBuZXVtb25pYUluZmx1ZW56YV9vcl9DT1ZJRERlYXRoczwtZGZfc3BlY2lmaWMgJT4lIAogIGdyb3VwX2J5KFN0YXRlKSAlPiUgCiAgc3VtbWFyaXNlKGBQbmV1bW9uaWEsIEluZmx1ZW56YSwgb3IgQ09WSUQtMTkgRGVhdGhzYD0gc3VtKGBQbmV1bW9uaWEsIEluZmx1ZW56YSwgb3IgQ09WSUQtMTkgRGVhdGhzYCxuYS5ybT1UUlVFKSkKCiMgb21pdHRpbmcgZm9yIGJldHRlciB2aWV3IE5ld3lvcmsgY2l0eSBhbmQgcHVlcnRvIHJpY28gClRvdGFsRGVhdGhfYnlfc3RhdGU8LVRvdGFsRGVhdGhfYnlfc3RhdGVbLWMoMzQsNDEpLF0KUG5ldW1vbmlhRGVhdGhfYnlfc3RhdGU8LVBuZXVtb25pYURlYXRoWy1jKDM0LDQxKSxdClBuZXVtb25pYUNPVklERGVhdGhzX2J5X3N0YXRlPC1QbmV1bW9uaWFDT1ZJRERlYXRoc1stYygzNCw0MSksXQpJbmZsdWVuemFEZWF0aHNfYnlfc3RhdGU8LUluZmx1ZW56YURlYXRoc1stYygzNCw0MSksXQpQbmV1bW9uaWFJbmZsdWVuemFfb3JfQ09WSUREZWF0aHNfYnlfc3RhdGU8LVBuZXVtb25pYUluZmx1ZW56YV9vcl9DT1ZJRERlYXRoc1stYygzNCw0MSksXQoKIyBzdGFuZGFyZGlzaW5kIGRhdGEgcGVyIDEwYDAwMAp1c19wb3B1bDwtc3RhdGVwb3AgCgpzdGFuZGFyZGlzZV9wb3A8LWZ1bmN0aW9uKGRhdGEpCnsKICBkYXRhWywyXT1kYXRhWywyXSoxMDAwMC91c19wb3B1bCRwb3BfMjAxNQogIHJldHVybihkYXRhKQp9CgpUb3RhbERlYXRoX2J5X3N0YXRlPC1zdGFuZGFyZGlzZV9wb3AoVG90YWxEZWF0aF9ieV9zdGF0ZSkKVG90YWxEZWF0aF9ieV9zdGF0ZQpQbmV1bW9uaWFEZWF0aF9ieV9zdGF0ZTwtc3RhbmRhcmRpc2VfcG9wKFBuZXVtb25pYURlYXRoX2J5X3N0YXRlKQpQbmV1bW9uaWFEZWF0aF9ieV9zdGF0ZQpQbmV1bW9uaWFDT1ZJRERlYXRoc19ieV9zdGF0ZTwtc3RhbmRhcmRpc2VfcG9wKFBuZXVtb25pYUNPVklERGVhdGhzX2J5X3N0YXRlKQpQbmV1bW9uaWFDT1ZJRERlYXRoc19ieV9zdGF0ZQpJbmZsdWVuemFEZWF0aHNfYnlfc3RhdGU8LXN0YW5kYXJkaXNlX3BvcChJbmZsdWVuemFEZWF0aHNfYnlfc3RhdGUpCkluZmx1ZW56YURlYXRoc19ieV9zdGF0ZQpQbmV1bW9uaWFJbmZsdWVuemFfb3JfQ09WSUREZWF0aHNfYnlfc3RhdGU8LXN0YW5kYXJkaXNlX3BvcChQbmV1bW9uaWFJbmZsdWVuemFfb3JfQ09WSUREZWF0aHNfYnlfc3RhdGUpClBuZXVtb25pYUluZmx1ZW56YV9vcl9DT1ZJRERlYXRoc19ieV9zdGF0ZQoKCiMgYWxsIGZpbmUgbm93Ogp1c19wb3B1bCRmdWxsPT1QbmV1bW9uaWFJbmZsdWVuemFfb3JfQ09WSUREZWF0aHNfYnlfc3RhdGUkU3RhdGUKCiMgcmlnaHQgZGF0YXNldHMKdXNfVG90YWxEZWF0aDwtdXNfcG9wdWwKdXNfVG90YWxEZWF0aCRwb3BfMjAxNTwtVG90YWxEZWF0aF9ieV9zdGF0ZSRgVG90YWwgRGVhdGhzYAoKdXNfUG5ldW1vbmlhRGVhdGg8LXVzX3BvcHVsCnVzX1BuZXVtb25pYURlYXRoJHBvcF8yMDE1PC1QbmV1bW9uaWFDT1ZJRERlYXRoc19ieV9zdGF0ZSRgUG5ldW1vbmlhIGFuZCBDT1ZJRC0xOSBEZWF0aHNgCgp1c19QbmV1bW9uaWFDT1ZJRERlYXRoczwtdXNfcG9wdWwKdXNfUG5ldW1vbmlhQ09WSUREZWF0aHMkcG9wXzIwMTU8LVBuZXVtb25pYUNPVklERGVhdGhzX2J5X3N0YXRlJGBQbmV1bW9uaWEgYW5kIENPVklELTE5IERlYXRoc2AKCnVzX0luZmx1ZW56YURlYXRoczwtdXNfcG9wdWwKdXNfSW5mbHVlbnphRGVhdGhzJHBvcF8yMDE1PC1JbmZsdWVuemFEZWF0aHNfYnlfc3RhdGUkYEluZmx1ZW56YSBEZWF0aHNgCgp1c19QbmV1bW9uaWFJbmZsdWVuemFfb3JfQ09WSUREZWF0aHM8LXVzX3BvcHVsCnVzX1BuZXVtb25pYUluZmx1ZW56YV9vcl9DT1ZJRERlYXRocyRwb3BfMjAxNTwtUG5ldW1vbmlhSW5mbHVlbnphX29yX0NPVklERGVhdGhzX2J5X3N0YXRlJGBQbmV1bW9uaWEsIEluZmx1ZW56YSwgb3IgQ09WSUQtMTkgRGVhdGhzYAoKIyBwbG90cwoKcGxvdF91c21hcChkYXRhID0gdXNfVG90YWxEZWF0aCwgdmFsdWVzID0gInBvcF8yMDE1IiwgY29sb3IgPSAicmVkIikgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobmFtZSA9ICJ1c19Ub3RhbERlYXRoIiwgbGFiZWwgPSBzY2FsZXM6OmNvbW1hKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpwbG90X3VzbWFwKGRhdGEgPSB1c19QbmV1bW9uaWFEZWF0aCwgdmFsdWVzID0gInBvcF8yMDE1IiwgY29sb3IgPSAicmVkIikgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobmFtZSA9ICJ1c19QbmV1bW9uaWFEZWF0aCIsIGxhYmVsID0gc2NhbGVzOjpjb21tYSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQoKcGxvdF91c21hcChkYXRhID0gdXNfUG5ldW1vbmlhQ09WSUREZWF0aHMsIHZhbHVlcyA9ICJwb3BfMjAxNSIsIGNvbG9yID0gInJlZCIpICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKG5hbWUgPSAidXNfUG5ldW1vbmlhQ09WSUREZWF0aHMpIiwgbGFiZWwgPSBzY2FsZXM6OmNvbW1hKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpwbG90X3VzbWFwKGRhdGEgPSB1c19JbmZsdWVuemFEZWF0aHMsIHZhbHVlcyA9ICJwb3BfMjAxNSIsIGNvbG9yID0gInJlZCIpICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKG5hbWUgPSAidXNfSW5mbHVlbnphRGVhdGhzIiwgbGFiZWwgPSBzY2FsZXM6OmNvbW1hKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgpwbG90X3VzbWFwKGRhdGEgPSB1c19QbmV1bW9uaWFJbmZsdWVuemFfb3JfQ09WSUREZWF0aHMsIHZhbHVlcyA9ICJwb3BfMjAxNSIsIGNvbG9yID0gInJlZCIpICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKG5hbWUgPSAidXNfUG5ldW1vbmlhSW5mbHVlbnphX29yX0NPVklERGVhdGhzIiwgbGFiZWwgPSBzY2FsZXM6OmNvbW1hKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgoKCmBgYAoKCmBgYHtyfQojIHNvcnQgdGhlIGRhdGUgZGVwZW5kaW5nIG9uIHRoZSBjYXRlZ29yeToKClNlbGVjdF9BZ2VfR3JvdXA8LWZ1bmN0aW9uKERhdGFGcmFtZSwgYWdlZ3JvdXApCnsgCiAgYWdlX2dyb3VwczwtdW5pcXVlKGRmJGBBZ2UgZ3JvdXBgKQogIGlmKGFnZWdyb3VwICVpbiUgYWdlX2dyb3VwcykKICAgICB7CiAgICAgIGRmMT0gRGF0YUZyYW1lICU+JSBmaWx0ZXIoYEFnZSBncm91cGAgPT0gYWdlZ3JvdXAgKQogICAgICByZXR1cm4oZGYxKQogICAgIH0KICBlbHNlewogICAgd2FybmluZygiQWdlIGdyb3VwIHNlbGVjdGVkIG5vdCBpbiB0aGUgbGlzdCwgdGhlIHJldHVybmVkIGRhdGFmcmFtZSBoYXMgbm90IGJlZW4gZmlsdGVyZWQiKQogICAgcmV0dXJuIChEYXRhRnJhbWUpCiAgICAgfQogIH0KI1Rlc3Q6CiNTZWxlY3RfQWdlX0dyb3VwKGRmLCIwLTE3IHllYXJzIikKClNlbGVjdF9Hcm91cDwtZnVuY3Rpb24oRGF0YUZyYW1lLCBncm91cCkKeyAKICBhbGxfZ3JvdXBzPC11bmlxdWUoZGYkYEdyb3VwYCkKICBpZihncm91cCAlaW4lIGFsbF9ncm91cHMpCiAgewogICAgZGYxPSBEYXRhRnJhbWUgJT4lIGZpbHRlcihgR3JvdXBgID09IGdyb3VwICkKICAgIHJldHVybihkZjEpCiAgfQogIGVsc2V7CiAgICB3YXJuaW5nKCJHcm91cCBzZWxlY3RlZCBub3QgaW4gdGhlIGxpc3QsIHRoZSByZXR1cm5lZCBkYXRhZnJhbWUgaGFzIG5vdCBiZWVuIGZpbHRlcmVkIikKICAgIHJldHVybiAoRGF0YUZyYW1lKQogIH0KfQojVGVzdDoKI1NlbGVjdF9Hcm91cChkZiwgIkJ5IFRvdGFsIikKClNlbGVjdF9ISFNSZWdpb248LWZ1bmN0aW9uKERhdGFGcmFtZSwgcmVnaW9uKQp7IAogIGFsbF9yZWdpb25zPC11bmlxdWUoZGYkYEhIUyBSZWdpb25gKQogIGlmKHJlZ2lvbiAlaW4lIGFsbF9yZWdpb25zKQogIHsKICAgIGRmMT0gRGF0YUZyYW1lICU+JSBmaWx0ZXIoYEhIUyBSZWdpb25gID09IHJlZ2lvbiApCiAgICByZXR1cm4oZGYxKQogIH0KICBlbHNlewogICAgd2FybmluZygiSEhTIFJlZ2lvbiBzZWxlY3RlZCBub3QgaW4gdGhlIGxpc3QsIHRoZSByZXR1cm5lZCBkYXRhZnJhbWUgaGFzIG5vdCBiZWVuIGZpbHRlcmVkIikKICAgIHJldHVybiAoRGF0YUZyYW1lKQogIH0KfQoKI1Rlc3Q6CiMgU2VsZWN0X0hIU1JlZ2lvbihkZiw0KQojIFNlbGVjdF9ISFNSZWdpb24oZGYsLTEpCgpTZWxlY3RfU3RhdGU8LWZ1bmN0aW9uKERhdGFGcmFtZSwgc3RhdGUpCnsgCiAgYWxsX3N0YXRlczwtdW5pcXVlKGRmJFN0YXRlKQogIGlmKHN0YXRlICVpbiUgYWxsX3N0YXRlcykKICB7CiAgICBkZjE9IERhdGFGcmFtZSAlPiUgZmlsdGVyKGBTdGF0ZWAgPT0gc3RhdGUgKQogICAgcmV0dXJuKGRmMSkKICB9CiAgZWxzZXsKICAgIHdhcm5pbmcoIlN0YXRlIHNlbGVjdGVkIG5vdCBpbiB0aGUgbGlzdCwgdGhlIHJldHVybmVkIGRhdGFmcmFtZSBoYXMgbm90IGJlZW4gZmlsdGVyZWQiKQogICAgcmV0dXJuIChEYXRhRnJhbWUpCiAgfQp9CgojVGVzdDoKI1NlbGVjdF9TdGF0ZShkZiwiSGF3YWlpIikKI1NlbGVjdF9TdGF0ZShkZiwtMSkKClNlbGVjdF9QbGFjZURlYXRoPC1mdW5jdGlvbihEYXRhRnJhbWUsIHBsYWNlX2QpCnsgCiAgYWxsX3BsYWNlczwtdW5pcXVlKGRmJGBQbGFjZSBvZiBEZWF0aGApCiAgaWYocGxhY2VfZCAlaW4lIGFsbF9wbGFjZXMpCiAgewogICAgZGYxPSBEYXRhRnJhbWUgJT4lIGZpbHRlcihgUGxhY2Ugb2YgRGVhdGhgID09IHBsYWNlX2QgKQogICAgcmV0dXJuKGRmMSkKICB9CiAgZWxzZXsKICAgIHdhcm5pbmcoIlBsYWNlIG9mIGRlYXRoIHNlbGVjdGVkIG5vdCBpbiB0aGUgbGlzdCwgdGhlIHJldHVybmVkIGRhdGFmcmFtZSBoYXMgbm90IGJlZW4gZmlsdGVyZWQiKQogICAgcmV0dXJuIChEYXRhRnJhbWUpCiAgfQp9CgojVGVzdDoKIyBTZWxlY3RfUGxhY2VEZWF0aChkZiwiSGVhbHRoY2FyZSBzZXR0aW5nLCBpbnBhdGllbnQiKQojIFNlbGVjdF9QbGFjZURlYXRoKGRmLC0xKQoKU2VsZWN0X2FsbDwtZnVuY3Rpb24oRGF0YUZyYW1lLCBhZ2Vncm91cCxncm91cCxyZWdpb24sc3RhdGUscGxhY2VfZCkKewogICMgSSB3YW50IHRvIHVzZSAlPiUgYnV0IG5vdCBxdWl0ZSBjb25mb3J0YWJsZSwgSSBsbCB1c2UgYnJ1dGUgZm9yY2UgZmlyc3Q6CiAgZGYxPVNlbGVjdF9BZ2VfR3JvdXAoRGF0YUZyYW1lLGFnZWdyb3VwKQogIGRmMj0gU2VsZWN0X0dyb3VwKGRmMSxncm91cCkKICBkZjM9U2VsZWN0X0hIU1JlZ2lvbihkZjIsIHJlZ2lvbikKICBkZjQ9U2VsZWN0X1N0YXRlKGRmMyxzdGF0ZSkKICBkZjU9U2VsZWN0X1BsYWNlRGVhdGgoZGY0LHBsYWNlX2QpCiAgcmV0dXJuKGRmNSkKfQoKIyBldmVudHVhbGx5IGdpdmVzIHlvdSAwIG9yIDEgY29sdW1uCiNTZWxlY3RfYWxsKGRmLCIwLTE3IHllYXJzIiwiQnkgVG90YWwiLC0xLCJDYWxpZm9ybmlhIiwiSGVhbHRoY2FyZSBzZXR0aW5nLCBpbnBhdGllbnQiKQpgYGAKCgpgYGB7cn0KI1Rlc3RzOgpTZWxlY3RfUGxhY2VEZWF0aChkZiwiSGVhbHRoY2FyZSBzZXR0aW5nLCBpbnBhdGllbnQiKQpTZWxlY3RfUGxhY2VEZWF0aChkZiwtMSkKU2VsZWN0X2FsbChkZiwiMC0xNyB5ZWFycyIsIkJ5IFRvdGFsIiwtMSwiQ2FsaWZvcm5pYSIsIkhlYWx0aGNhcmUgc2V0dGluZywgaW5wYXRpZW50IikKU2VsZWN0X1N0YXRlKGRmLCJIYXdhaWkiKQpTZWxlY3RfU3RhdGUoZGYsLTEpClNlbGVjdF9ISFNSZWdpb24oZGYsNCkKU2VsZWN0X0hIU1JlZ2lvbihkZiwtMSkKU2VsZWN0X0dyb3VwKGRmLCAiQnkgVG90YWwiKQpTZWxlY3RfQWdlX0dyb3VwKGRmLCIwLTE3IHllYXJzIikKYGBgCgojIE5vdyBzdHVkeWluZyBjb3JyZWxhdGlvbnM6CgpgYGB7cn0KZGZfY29ycl9hZ2Vncm91cHMxPC1TZWxlY3RfQWdlX0dyb3VwKGRmLCJBbGwgQWdlcyIpIFssODoxM10gCmRmX2NvcnJfYWdlZ3JvdXBzMjwtU2VsZWN0X0FnZV9Hcm91cChkZiwiMC0xNyB5ZWFycyIpWyw4OjEzXQpkZl9jb3JyX2FnZWdyb3VwczM8LVNlbGVjdF9BZ2VfR3JvdXAoZGYsIjE4LTI5IHllYXJzIilbLDg6MTNdCmRmX2NvcnJfYWdlZ3JvdXBzNDwtU2VsZWN0X0FnZV9Hcm91cChkZiwiMzAtMzkgeWVhcnMiKVssODoxM10KZGZfY29ycl9hZ2Vncm91cHM1PC1TZWxlY3RfQWdlX0dyb3VwKGRmLCI0MC00OSB5ZWFycyIpWyw4OjEzXQpkZl9jb3JyX2FnZWdyb3VwczY8LVNlbGVjdF9BZ2VfR3JvdXAoZGYsIjUwLTY0IHllYXJzIilbLDg6MTNdCmRmX2NvcnJfYWdlZ3JvdXBzNzwtU2VsZWN0X0FnZV9Hcm91cChkZiwiNjUtNzQgeWVhcnMiKVssODoxM10KZGZfY29ycl9hZ2Vncm91cHM4PC1TZWxlY3RfQWdlX0dyb3VwKGRmLCI3NS04NCB5ZWFycyIpWyw4OjEzXQpkZl9jb3JyX2FnZWdyb3Vwczk8LVNlbGVjdF9BZ2VfR3JvdXAoZGYsIjg1IHllYXJzIGFuZCBvdmVyIilbLDg6MTNdCmBgYAoKCmBgYHtyfQojICMgaW5zdGFsbC5wYWNrYWdlcygiUGVyZm9ybWFuY2VBbmFseXRpY3MiKQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQpjaGFydC5Db3JyZWxhdGlvbihkZl9jb3JyX2FnZWdyb3VwczEsIGhpc3RvZ3JhbSA9IFRSVUUsIG1ldGhvZCA9ICJwZWFyc29uIikKY2hhcnQuQ29ycmVsYXRpb24oZGZfY29ycl9hZ2Vncm91cHMyLCBoaXN0b2dyYW0gPSBUUlVFLCBtZXRob2QgPSAicGVhcnNvbiIpCmNoYXJ0LkNvcnJlbGF0aW9uKGRmX2NvcnJfYWdlZ3JvdXBzMywgaGlzdG9ncmFtID0gVFJVRSwgbWV0aG9kID0gInBlYXJzb24iKQpjaGFydC5Db3JyZWxhdGlvbihkZl9jb3JyX2FnZWdyb3VwczQsIGhpc3RvZ3JhbSA9IFRSVUUsIG1ldGhvZCA9ICJwZWFyc29uIikKY2hhcnQuQ29ycmVsYXRpb24oZGZfY29ycl9hZ2Vncm91cHM1LCBoaXN0b2dyYW0gPSBUUlVFLCBtZXRob2QgPSAicGVhcnNvbiIpCmNoYXJ0LkNvcnJlbGF0aW9uKGRmX2NvcnJfYWdlZ3JvdXBzNiwgaGlzdG9ncmFtID0gVFJVRSwgbWV0aG9kID0gInBlYXJzb24iKQpjaGFydC5Db3JyZWxhdGlvbihkZl9jb3JyX2FnZWdyb3VwczcsIGhpc3RvZ3JhbSA9IFRSVUUsIG1ldGhvZCA9ICJwZWFyc29uIikKY2hhcnQuQ29ycmVsYXRpb24oZGZfY29ycl9hZ2Vncm91cHM4LCBoaXN0b2dyYW0gPSBUUlVFLCBtZXRob2QgPSAicGVhcnNvbiIpCmNoYXJ0LkNvcnJlbGF0aW9uKGRmX2NvcnJfYWdlZ3JvdXBzOSwgaGlzdG9ncmFtID0gVFJVRSwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKCgpgYGB7cn0KbW9kZWwubWF0cml4KH4wKy4sIGRhdGE9ZGYpICU+JSAKICBjb3IodXNlPSJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSAlPiUgCiAgZ2djb3JycGxvdChzaG93LmRpYWcgPSBGLCB0eXBlPSJsb3dlciIsIGxhYj1UUlVFLCBsYWJfc2l6ZT0yKQpgYGAKCgpgYGB7cn0Kc3QxIDwtIHN0cnVjdGFibGUofkdyb3VwK2BBZ2UgZ3JvdXBgLCBkZikKI3N0MQpwYWlycyhzdDEpCgpzdDIgPC0gc3RydWN0YWJsZSh+YEhIUyBSZWdpb25gK2BTdGF0ZWArYFBsYWNlIG9mIERlYXRoYCwgZGYpCiNzdDIKcGFpcnMoc3QyKQoKc3RfYWdlPC0gc3RydWN0YWJsZSh+YENPVklELTE5IERlYXRoc2ArYFBuZXVtb25pYSBEZWF0aHNgK2BBZ2UgZ3JvdXBgLCBkZikKcGFpcnMoc3RfYWdlKQoKYGBgCgoK